﻿Public Class VirtualThumbsticks

#Region "fields"

	'jarak pada layar yang merepresentasikan nilai dari thumbstick value = 1f
	Private Const maxThumbstickDistance As Single = 60.0F

	'penanda dimana letak titik sentuhnya
	Private Shared leftPosition As Vector2
	Private Shared rightPosition As Vector2

	'ID penanda letak titik sentuhnya
	Private Shared leftId% = -1
	Private Shared rightId% = -1

	'get posisi tengah dari thumbstick kiri
	Public Shared Property LeftThumbstickCenter As Vector2?

		Get

		End Get
		Private Set(value As Vector2?)

		End Set
	End Property
	'{ get private set }

	'get posisi tengah dari thumbstick kanan
	Public Shared Property RightThumbstickCenter As Vector2?

		Get

		End Get
		Private Set(value As Vector2?)

		End Set
	End Property
	' { get private set }
#End Region

#Region "ambil nilai kiri dan kanan"
	'mengambil nilai dari left thumbstick
	Public Shared ReadOnly Property LeftThumbstick As Vector2

		Get


			'jika tidak ada nilai dari left thumbstick, maka nilai dikembalikan ke (0, 0)
			If Not (LeftThumbstickCenter.HasValue) Then Return Vector2.Zero

			'membandingkan nilai vektor dari posisi tersentuh ke center
			'dibandingkan dengan jarak maximum thumbstick
			Dim l As Vector2 = (leftPosition - LeftThumbstickCenter.Value) / maxThumbstickDistance

			'jika nilai jarak lebih dari 1, vektor di normalkan kembali
			If (l.LengthSquared() > 1.0F) Then l.Normalize()

			Return l
		End Get
	End Property

	'mengambil nilai dari right thumbstick
	Public Shared ReadOnly Property RightThumbstick As Vector2

		Get

			'jika tidak ada nilai dari right thumbstick, maka nilai dikembalikan ke (0, 0)
			If Not (RightThumbstickCenter.HasValue) Then Return Vector2.Zero

			'membandingkan nilai vektor dari posisi tersentuh ke center
			'dibandingkan dengan jarak maximum thumbstick
			Dim r As Vector2 = (rightPosition - RightThumbstickCenter.Value) / maxThumbstickDistance

			'jika nilai jarak lebih dari 1, vektor di normalkan kembali
			If (r.LengthSquared() > 1.0F) Then r.Normalize()

			Return r
		End Get
	End Property
#End Region

#Region "update"

	'update nilai dari virtual thumbstick berdasarkan letak sentuhan terakhir, hal ini harus diupdate tiap frame.
	Public Shared Sub Update()

		Dim leftTouch, rightTouch As TouchLocation?
		leftTouch = Nothing : rightTouch = Nothing
		Dim touches As TouchCollection = TouchPanel.GetState()

		'memeriksa semua sentuhan yang ada lalu dikonversikan kedalam posisi virtual dpadnya,
		'perhatikan bahwa "touches" adalah kumpulan dari semua sentuhan pada saat seketika
		'hanya informasi yang tepat yang akan kita akses sebagai lokasi terakhir dari setiap sentuhan
		For Each Touch As TouchLocation In touches

			If (Touch.Id = leftId) Then
				'ini adalah gerakan dari left-stick touch yang telah kita tracking
				leftTouch = Touch
				Continue For
			End If
			If (Touch.Id = rightId) Then

				'ini adalah gerakan dari right-stick touch yang telah kita tracking
				rightTouch = Touch
				Continue For
			End If

			'kita tidak akan melanjutkan gesture thumbstick yang ada, kita membuat yang baru lagi
			'kita akan menggunakan posisi sentuhan terakhir untuk mendapatkan letak sedekat mungkin
			'dimana letak awal gesture sebenarnya

			Dim earliestTouch As TouchLocation
			If Not (Touch.TryGetPreviousLocation(earliestTouch)) Then earliestTouch = Touch

			If (leftId = -1) Then

				'jika kita tidak sedang tracking left thumbstick, tapi touch-nya ada di
				'setengah dari kiri layar, kita mulai untuk tracking touch ini sebagai left stick kita

				If (earliestTouch.Position.X < TouchPanel.DisplayWidth / 2) Then

					leftTouch = earliestTouch
					Continue For
				End If
			End If

			If (rightId = -1) Then

				'jika kita tidak sedang tracking right thumbstick, tapi touch-nya ada di
				'setengah dari kanan layar, kita mulai untuk tracking touch ini sebagai right stick kita

				If (earliestTouch.Position.X < TouchPanel.DisplayWidth / 2) Then

					rightTouch = earliestTouch
					Continue For
				End If
			End If
		Next

		'jika kita punya left touch

		If (leftTouch.HasValue) Then

			'kalo ga ada centernya, posisi yang tersentuh kita jadikan centernya
			If Not (LeftThumbstickCenter.HasValue) Then LeftThumbstickCenter = leftTouch.Value.Position

			'menyimpan letak touch-nya
			leftPosition = leftTouch.Value.Position

			'menyimpan ID dari touch-nya
			leftId = leftTouch.Value.Id

		Else

			'kalo tidak, kita coba reset nilai kita untuk tidak nge-tracking sentuhan apapun
			'untuk left thumbstick
			LeftThumbstickCenter = Nothing
			leftId = -1
		End If

		' jika kita punya right touch
		If (rightTouch.HasValue) Then

			'kalo ga ada center, kita jadikan posisi sentuhannya sebagai center
			If Not (RightThumbstickCenter.HasValue) Then RightThumbstickCenter = rightTouch.Value.Position

			'simpan letak sentuhannya
			rightPosition = rightTouch.Value.Position

			'simpan ID sentuhannya
			rightId = rightTouch.Value.Id

		Else

			'kita reset nilai pusatnya,agar dia tidak nge-tracking sentuhan apapun
			'untuk right thumbstick
			RightThumbstickCenter = Nothing
			rightId = -1
		End If
	End Sub
#End Region
End Class
